Images disappearing after sync

Hi everyone,

I’m experiencing a strange issue with image display in my app. Images are uploaded through a form, saved in a Google Drive folder, and the relative path is correctly written to the Google Sheet. The image shows up initially, but after a sync, it disappears from the app view.

What’s odd is that if I close the app and reopen it later, the image sometimes reappears. So it seems like the image file is there, and the path is correct, but AppSheet intermittently fails to load or display it right after syncing.

A few additional details:

  • The image column is set to type Image.

  • The image path saved in the sheet is a relative path like: AppName/Images/filename.jpg.

  • There are no security filters affecting the row.

  • Offline features and delayed sync are enabled.

Has anyone else run into this issue? Is there a known workaround to make sure the image consistently displays after sync?

Thanks in advance!

3 Likes

Is the folder that the images are stored in owned by the same person who owns the app?

Hi jako1345,

Based on the symptoms you described, where images disappear after a sync, this often points to a File System Permission or Ownership conflict on the server side (especially if you are using a custom backend or a specific cloud storage integration).

When a file is uploaded, the system might be saving it under a temporary user or a root/service account. After the sync, the application user (the one running the AppSheet connector) might not have the necessary rights to ‘read’ or ‘view’ that file.

You should ensure that the uploaded files are owned by the application’s primary user. You can fix this using the chown command in your server environment:

Bash

# Change ownership to the application user and group
# Replace 'appuser' with your actual system username
sudo chown appuser:appgroup /path/to/your/images/folder/*

# Ensure the correct permissions for reading and writing
sudo chmod 664 /path/to/your/images/folder/*.jpg

Why this matters: If the file ownership is not aligned with the application user, the sync process might verify the path’s existence but fail to render the image due to an ‘Access Denied’ error at the system level. This is a common hurdle in integrated cloud environments.

1 Like

Adding to the point of File Ownership:

The ideal practice is to ensure that images are uploaded using the same system user that runs the application environment. Many developers create a separate ‘upload user’ for security reasons, but this often leads to permission conflicts after syncing.

If the upload process and the application run under the same user identity, the file automatically inherits the correct ownership (Implicit Ownership), and you won’t need to manually run chown every time.

If you are using a separate user for uploads, you must ensure that both users belong to the same Group and that the directory has the SetGID bit active, so new files always belong to the group that the application can read.

# Check the current user running the process

whoami

# Check the ownership of the uploaded image

ls -l /path/to/your/image.jpg
1 Like

I’m gonna guess either a bot, or someone who doesn’t use AppSheet. Either way, this post is irrelevant to AppSheet.

4 Likes

Ditto.

3 Likes

Thanks for the reply. Yes all owned by the app owner. The interesting thing is it will show back up after 3-4 refreshes.

One other thing to add it looks like 9 times out of ten it shows fine on mobile app but not on desktop

Have you tried clearing your cache?

1 Like

Hi jako1345,

Thanks for clarifying that! If it works fine on mobile but fails on desktop—and eventually appears after a few refreshes—it means the file is definitely there, but we are likely dealing with an AppSheet Image Proxy or a Sync Latency issue rather than a storage permission problem.

Since AppSheet is a managed service, we can’t touch the server-side, but we can tweak how the app “fetches” those images. Here is what I suspect is happening:

1. The “Security Signing” Hurdle AppSheet tries to protect your images by “signing” the URLs. Sometimes the desktop browser fails to validate this signature immediately after a sync.

  • Try this: Go to Security > Settings and toggle OFF “Require Image and File Signing”. Test if the images appear instantly on desktop after that.

2. Delayed Sync vs. Google Drive Indexing Since you have Delayed Sync enabled, the app tells the spreadsheet “the image is here,” but Google Drive might still be processing the actual file upload in the background. The mobile app is often faster at showing cached local files, while the Desktop (browser) has to wait for a “clean” response from the server.

  • Test: Try disabling “Delayed Sync” for a moment. If the images show up immediately, then the issue is just a “race condition” between the data sync and the file upload.

3. Browser Cache (Desktop) Browsers are much more aggressive with caching than the app. When you sync, the browser might be trying to load the “old” (empty) state of the image link.

  • Check: Does a “Hard Refresh” (Ctrl + F5) on Chrome make the image appear faster than a normal sync?

4. Verification Link You can create a temporary Virtual Column with this formula to see if the internal URL is being generated correctly right after the sync:

Excel

/* Constructing the internal AppSheet URL to test accessibility */
CONCATENATE(
  "https://www.appsheet.com/template/gettablefileurl?appName=", 
  ENCODEURL("YourAppName-AccountID"), 
  "&tableName=", 
  ENCODEURL("YourTableName"), 
  "&fileName=", 
  ENCODEURL([ImageColumnName])
)

Let me know if turning off the “Image Signing” fixes it—that’s usually the ‘silent killer’ for images on desktop!

One more thing to consider: we might be hitting Google Drive’s API Rate Limits or IP-based quotas.

Google Drive isn’t a dedicated CDN; it has strict limits on how many times a file can be “fetched” via an external proxy in a short window. When you sync, the data hits your Google Sheet almost instantly, but there’s often a slight Indexing Latency for the actual image file.

The mobile app handles this gracefully because it can show a local cached version, but the desktop browser makes a fresh request. If Google hasn’t “indexed” the file for external viewing yet, or if it sees too many requests from your IP/Account, it might temporarily throttle the image display. This perfectly explains why it suddenly “reappears” after a few refreshes—once the indexing is complete and the quota resets.

This is a known AppSheet sync/cache issue. With offline + delayed sync enabled, AppSheet sometimes refreshes row data before the image is fully available, so it disappears temporarily. Closing and reopening the app reloads the cache, which is why the image reappears.

Fix: let AppSheet manage the image path, avoid editing it manually, and disable Delayed Sync if possible.